package tp.tecnicasdisenio.model.regla;

import java.util.LinkedList;
import java.util.List;

import tp.tecnicasdisenio.model.AccionInterface;
import tp.tecnicasdisenio.model.AutoRespondedorInterface;
import tp.tecnicasdisenio.model.MailInterface;
import tp.tecnicasdisenio.model.ReglaInterface;
import tp.tecnicasdisenio.model.parser.ParserTituloAbstract;

public abstract class ReglaAbstract implements ReglaInterface {

	private ReglaInterface siguiente;
	private List<AccionInterface> acciones= new LinkedList<AccionInterface>();

	@Override
	public void nuevaAccion(AccionInterface accion){
		acciones.add(accion);
	}
	
	@Override
	public void aplicarAccionesSobre(MailInterface mail, AutoRespondedorInterface autoRespondedor) {		
		System.out.println("RESPONSABLE ACTUAL: " + this.getClass().getSimpleName());
		if(!this.aplica(mail)){
			System.out.println("    no aplica: " + this.getClass().getSimpleName());
			pasarResponsabilidad(mail, autoRespondedor);
		}else{
			System.out.println("APLICA REGLA: " + this.getClass().getSimpleName());
			mail.aplicaRegla();
			for(AccionInterface unaAccion : acciones){
				unaAccion.aplicarSobre(mail, autoRespondedor);
			}
		}
	}

	protected void pasarResponsabilidad(MailInterface mail, AutoRespondedorInterface autoRespondedor) {
		if (this.siguiente != null){
			this.siguiente.aplicarAccionesSobre(mail, autoRespondedor);
		}
	}
	
	@Override
	public boolean aplica(MailInterface mail) {
		return getParserTitulo().formatoValido(mail);
	}

	public void siguiente(ReglaInterface siguiente) {
		this.siguiente = siguiente;
	}

	public abstract ParserTituloAbstract getParserTitulo();

	
}
